import { defineStore } from 'pinia';

import { getUserInfo, login as loginApi } from '@/api/auth';
import { usePermissionStore } from '@/store';
import type { UserInfo } from '@/types/interface';

const InitUserInfo: UserInfo = {
  name: '', // 用户名，用于展示在页面右上角头像处
  roles: [], // 前端权限模型使用 如果使用请配置modules/permission-fe.ts使用
};

export const useUserStore = defineStore('user', {
  state: () => ({
    token: '', // 默认token不走权限
    userInfo: { ...InitUserInfo },
  }),
  getters: {
    roles: (state) => {
      return state.userInfo?.roles;
    },
  },
  actions: {
    async login(userInfo: Record<string, unknown>) {
      try {
        const { account, password } = userInfo;
        if (!account || !password) {
          throw new Error('账号和密码不能为空');
        }

        const response = await loginApi({
          account: account as string,
          password: password as string,
        });

        if (response && response.token) {
          this.token = response.token;
          // 登录成功后立即获取用户信息
          const result = await this.getUserInfo();
          if (!result.success) {
            throw new Error(result.message);
          }
        } else {
          console.log('登录响应无token:', response);
          throw new Error('登录失败，请检查账号密码');
        }
      } catch (error: any) {
        console.error('登录过程错误:', error);
        // 直接抛出原始错误，不要重新包装，以保留详细的错误消息
        throw error;
      }
    },
    async getUserInfo() {
      try {
        if (!this.token) {
          // 返回一个明确的结果而不是抛出异常
          return { success: false, message: '未登录' };
        }

        // 这里调用后端获取用户信息的接口
        // 暂时使用模拟数据，后续需要对接真实接口
        const userInfo = {
          name: '管理员',
          roles: ['all'], // 前端权限模型使用 如果使用请配置modules/permission-fe.ts使用
        };

        this.userInfo = userInfo;
        return { success: true, data: userInfo };
      } catch (error: any) {
        return { success: false, message: error.message || '获取用户信息失败' };
      }
    },
    async logout() {
      this.token = '';
      this.userInfo = { ...InitUserInfo };
    },
  },
  persist: {
    afterRestore: () => {
      const permissionStore = usePermissionStore();
      permissionStore.initRoutes();
    },
    key: 'user',
    paths: ['token'],
  },
});
